﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccess;
using System.Data;
using System.Data.SqlClient;
using Support.DTO;

namespace DataAccess
{
    public class HistoriaClinicaDAL : BaseSQLDAL
    {
        public int GuardarHistoriaClinica(HistoriaClinicaDTO historia)
        {
            try
            {
                CreateCommand("Historia_Guardar", true);
                AddCmdParameter("@Diagnostico", string.IsNullOrEmpty(historia.DiagnosticoPresuntivo) ? "" : historia.DiagnosticoPresuntivo, ParameterDirection.Input);
                AddCmdParameter("@Metodos", string.IsNullOrEmpty(historia.MetodosComplementarios) ? "" : historia.MetodosComplementarios, ParameterDirection.Input);
                AddCmdParameter("@Tratamiento", string.IsNullOrEmpty(historia.Tratamiento) ? "" : historia.Tratamiento, ParameterDirection.Input);
                AddCmdParameter("@AfiliadoId", historia.AfiliadoId, ParameterDirection.Input);
                AddCmdParameter("@PatologiaId", historia.Patologia.Id, ParameterDirection.Input);
                ExecuteReader();
                Read();

                return Convert.ToInt32(GetOutResult("historia_id"));
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                //DisposeDataReader();
                CloseConnection();
            }
        }

        public void Modificar(HistoriaClinicaDTO historia)
        {
            try
            {
                CreateCommand("Historia_Modificar", true);
                AddCmdParameter("@Diagnostico", string.IsNullOrEmpty(historia.DiagnosticoPresuntivo) ? "" : historia.DiagnosticoPresuntivo, ParameterDirection.Input);
                AddCmdParameter("@Metodos", string.IsNullOrEmpty(historia.MetodosComplementarios) ? "" : historia.MetodosComplementarios, ParameterDirection.Input);
                AddCmdParameter("@Tratamiento", string.IsNullOrEmpty(historia.Tratamiento) ? "" : historia.Tratamiento, ParameterDirection.Input);
                AddCmdParameter("@HistoriaId", historia.Id, ParameterDirection.Input);
                AddCmdParameter("@PatologiaId", historia.Patologia.Id, ParameterDirection.Input);

                ExecuteReader();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                //DisposeDataReader();
                CloseConnection();
            }
        }

        public HistoriaClinicaDTO ObtenerPorId(int historiaId)
        {
            try
            {
                HistoriaClinicaDTO historia = null;
                CreateCommand("Historia_ObtenerPorId", true);
                AddCmdParameter("@HistoriaId", historiaId, ParameterDirection.Input);

                ExecuteReader();
                while (Read())
                {
                    historia = FillDTO(GetDataReader());
                }
                return historia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }


        public List<HistoriaClinicaDTO> Buscar(string nombre, string apellido, string nroDocumento, string obraSocialNro)
        {
            try
            {
                var historias = new List<HistoriaClinicaDTO>();
                CreateCommand("Historia_Buscar", true);

                if (string.IsNullOrEmpty(nombre))
                    AddCmdParameter("@Nombre", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@Nombre", nombre, ParameterDirection.Input);

                if (string.IsNullOrEmpty(apellido))
                    AddCmdParameter("@Apellido", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@Apellido", apellido, ParameterDirection.Input);

                if (string.IsNullOrEmpty(nroDocumento))
                    AddCmdParameter("@NroDocumento", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@NroDocumento", nroDocumento, ParameterDirection.Input);

                if (string.IsNullOrEmpty(obraSocialNro))
                    AddCmdParameter("@ObraSocialNro", DBNull.Value, ParameterDirection.Input);
                else
                    AddCmdParameter("@ObraSocialNro", obraSocialNro, ParameterDirection.Input);
                
                ExecuteReader();
                while (Read())
                {
                    historias.Add(FillDTO(GetDataReader()));
                }
                return historias;


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }


        public List<HistoriaClinicaDTO> BusquedaRapida(string parametro)
        {
            try
            {
                var historias = new List<HistoriaClinicaDTO>();
                CreateCommand("Historia_BusquedaRapida", true);
                AddCmdParameter("@Parametro", parametro, ParameterDirection.Input);
                
                ExecuteReader();
                while (Read())
                {
                    historias.Add(FillDTO(GetDataReader()));
                }
                return historias;


            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }

        #region RELLENADO DE ENTIDADES

        private HistoriaClinicaDTO FillDTO(SqlDataReader reader)
        {
            var hc = new HistoriaClinicaDTO()
            {
                Id = Convert.ToInt32(GetOutResult("historiaId")),
                DiagnosticoPresuntivo = Convert.ToString(GetOutResult("diagnosticoPresuntivo")),
                MetodosComplementarios = Convert.ToString(GetOutResult("metodosComplementarios")),
                Tratamiento = Convert.ToString(GetOutResult("tratamiento")),
                AfiliadoId = Convert.ToInt32(GetOutResult("afiliadoId"))
            };
            hc.Abdomen = FillAbdomben(reader);
            hc.ConsultaInicial = FillConsultaInicial(reader);
            hc.Cuello = FillCuello(reader);
            hc.ExamenVarios = FillExamenVarios(reader);
            hc.OsteoMuscular = FillOsteoMuscular(reader);
            hc.SignosVitales = FillSignosVitales(reader);
            hc.SistemaNervioso = FillSistemaNervioso(reader);
            hc.Patologia = FillPatologia(reader);

            return hc;
        }

        private AbdomenDTO FillAbdomben(SqlDataReader reader)
        {
            return new AbdomenDTO()
            {
                Id = Convert.ToInt32(GetOutResult("abdomenId")),
                Auscultacion = Convert.ToString(GetOutResult("auscultacion")),
                Inspeccion = Convert.ToString(GetOutResult("inspeccion")),
                Palpacion = Convert.ToString(GetOutResult("palpacion")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId"))
            };
        }

        private ConsultaInicialDTO FillConsultaInicial(SqlDataReader reader)
        {
            return new ConsultaInicialDTO()
            {
                Id = Convert.ToInt32(GetOutResult("consultaId")),
                AutoValidoTotal = Convert.ToString(GetOutResult("autoValidoTotal")),
                AutoValidoParcial = Convert.ToString(GetOutResult("autoValidoParcial")),
                Dependiente = Convert.ToString(GetOutResult("dependiente")),
                MotivoConsulta = Convert.ToString(GetOutResult("motivoConsulta")),
                AntecedentesEnfermedad = Convert.ToString(GetOutResult("antecedentesEnfermedad")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId")),
            };
        }

        private CuelloDTO FillCuello(SqlDataReader reader)
        {
            return new CuelloDTO()
            {
                Id = Convert.ToInt32(GetOutResult("cuelloId")),
                Palpacion = Convert.ToString(GetOutResult("palpacion")),
                Tamaño = Convert.ToString(GetOutResult("tamanio")),
                Auscultacion = Convert.ToString(GetOutResult("auscultacion")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId"))
            };
        }


        private ExamenVariosDTO FillExamenVarios(SqlDataReader reader)
        {
            return new ExamenVariosDTO()
            {
                Id = Convert.ToInt32(GetOutResult("consultaId")),
                Craneo = Convert.ToString(GetOutResult("craneo")),
                Ojo = Convert.ToString(GetOutResult("ojo")),
                Oido = Convert.ToString(GetOutResult("oido")),
                PCFG = Convert.ToString(GetOutResult("pcfg")),
                ToraxForma = Convert.ToString(GetOutResult("toraxForma")),
                ToraxMamas = Convert.ToString(GetOutResult("toraxMamas")),
                AuscultacionMV = Convert.ToString(GetOutResult("auscultacionMV")),
                AuscultacionVV = Convert.ToString(GetOutResult("auscultacionVV")),
                Rales = Convert.ToString(GetOutResult("rales")),
                Excursion = Convert.ToString(GetOutResult("excursion")),
                R1 = Convert.ToString(GetOutResult("acvR1")),
                R2 = Convert.ToString(GetOutResult("acvR2")),
                Soplos = Convert.ToString(GetOutResult("soplos")),
                Carotideo = Convert.ToString(GetOutResult("carotideo")),
                Radial = Convert.ToString(GetOutResult("radial")),
                Femoral = Convert.ToString(GetOutResult("femoral")),
                Pedio = Convert.ToString(GetOutResult("pedio")),
                PPRenalDerecha = Convert.ToString(GetOutResult("ppRenalDerecha")),
                PPRenalIzquierda = Convert.ToString(GetOutResult("ppRenalIzquierda")),
                PPRenalMamas = Convert.ToString(GetOutResult("mamas")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId"))
            };
        }

        private OsteoMuscularDTO FillOsteoMuscular(SqlDataReader reader)
        {
            return new OsteoMuscularDTO()
            {
                Id = Convert.ToInt32(GetOutResult("osteoMuscularId")),
                Cervical = Convert.ToString(GetOutResult("columnaCervical")),
                Dorsal = Convert.ToString(GetOutResult("dorsal")),
                Lumbar = Convert.ToString(GetOutResult("lumbar")),
                Movilidad = Convert.ToString(GetOutResult("movilidad")),
                Dolor = Convert.ToString(GetOutResult("dolor")),
                Tumefaccion = Convert.ToString(GetOutResult("tumefaccion")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId"))
            };
        }

        private SignosVitalesDTO FillSignosVitales(SqlDataReader reader)
        {
            return new SignosVitalesDTO()
            {
                Id = Convert.ToInt32(GetOutResult("signosVitalesId")),
                FrecuenciaCardiaca = Convert.ToString(GetOutResult("frecuenciaCardiaca")),
                PulsoRadial = Convert.ToString(GetOutResult("pulsoRadial")),
                Ritmo = Convert.ToString(GetOutResult("ritmo")),
                PresionArterial = Convert.ToString(GetOutResult("presionArterial")),
                FrecuenciaRespiratoria = Convert.ToString(GetOutResult("frecuenciaRespiratoria")),
                PesoActual = Convert.ToString(GetOutResult("pesoActual")),
                PesoHabitual = Convert.ToString(GetOutResult("pesoHabitual")),
                Estatura = Convert.ToString(GetOutResult("estatura")),
                Temperatura = Convert.ToString(GetOutResult("temperatura")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId"))
            };
        }

        private SistemaNerviosoDTO FillSistemaNervioso(SqlDataReader reader)
        {
            return new SistemaNerviosoDTO()
            {
                Id = Convert.ToInt32(GetOutResult("sistemaNerviosoId")),
                Sensorio = Convert.ToString(GetOutResult("sensorio")),
                Lenguaje = Convert.ToString(GetOutResult("lenguaje")),
                Marcha = Convert.ToString(GetOutResult("marcha")),
                Temblor = Convert.ToString(GetOutResult("temblor")),
                Taxia = Convert.ToString(GetOutResult("taxia")),
                ReflejosFotomotor = Convert.ToString(GetOutResult("reflejosFotomotor")),
                ReflejosAcomodacion = Convert.ToString(GetOutResult("reflejosAcomodacion")),
                OsteoTendinosos = Convert.ToString(GetOutResult("osteotendinosos")),
                Sensibilidad = Convert.ToString(GetOutResult("sensibilidad")),
                HistoriaId = Convert.ToInt32(GetOutResult("historiaId"))
            };
        }

        private PatologiaDTO FillPatologia(SqlDataReader reader)
        {
            var pat = new PatologiaDTO();
            pat.Id = GetOutResult("patologiaId") == DBNull.Value ? 0 : Convert.ToInt32(GetOutResult("patologiaId"));
            pat.Nombre = Convert.ToString(GetOutResult("patologiaNombre"));
            pat.Descripcion = Convert.ToString(GetOutResult("patologiaDescripcion"));
            return pat;
        }

        #endregion

        public void Eliminar(int historiaId)
        {
            try
            {
                CreateCommand("Historia_Eliminar", true);
                AddCmdParameter("@HistoriaId", historiaId, ParameterDirection.Input);

                ExecuteReader();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                //DisposeDataReader();
                CloseConnection();
            }
        }

        public HistoriaClinicaDTO BuscarPorAfiliadoId(int afiliadoId)
        {
            try
            {
                var historia = new HistoriaClinicaDTO();
                CreateCommand("Historia_Buscar", true);

                AddCmdParameter("@AfiliadoId", afiliadoId, ParameterDirection.Input);
                
                ExecuteReader();
                while (Read())
                {
                    historia = FillDTO(GetDataReader());
                }
                return historia;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                DisposeCommand();
                DisposeDataReader();
                CloseConnection();
            }
        }
    }
}
